// Agent 工具定义 - 使用 Vercel AI SDK 的 tool 格式
import { tool } from 'ai';
import { z } from 'zod';
import { getWeatherData } from './weather-api'

// 1. 地理编码工具 - 通过城市名获取经纬度
export const getGeocode = tool({
  description: '通过城市名称查询经纬度。输入参数为城市名（如"北京"）',
  parameters: z.object({
    city: z.string().describe('需要查询经纬度的城市名称，如"上海"、"New York"'),
  }),
  execute: async ({ city }) => {
    const mockGeocodes: Record<string, { latitude: number; longitude: number }> = {
      "北京": { latitude: 39.9042, longitude: 116.4074 },
      "上海": { latitude: 31.2304, longitude: 121.4737 },
      "广州": { latitude: 23.1291, longitude: 113.2644 },
      "深圳": { latitude: 22.5431, longitude: 114.0579 },
      "San Francisco": { latitude: 37.7749, longitude: -122.4194 },
      "New York": { latitude: 40.7128, longitude: -74.0060 },
    };
    console.log(`🔍 查询城市: ${city}`);

    const geocode = mockGeocodes[city];
    if (geocode) {
      return geocode;
    } else {
      throw new Error(`未找到城市"${city}"的经纬度，请检查城市名称是否正确。`);
    }
  },
});

// 2. 天气查询工具 - 通过经纬度获取天气
export const getCurrentWeather = tool({
  description: '用于获取指定位置的当前天气。需要传入经纬度（latitude 和 longitude）。如果用户问的是城市名（如"北京"），请先调用 getGeocode 工具获取该城市的经纬度，然后再调用此工具。',
  parameters: z.object({
    latitude: z.number().describe('纬度，例如 39.9042（北京）'),
    longitude: z.number().describe('经度，例如 116.4074（北京）'),
  }),
  execute: async ({ latitude, longitude }) => {
    console.log(`🌤️  查询天气: 纬度 ${latitude}, 经度 ${longitude}`);
    const weatherData = await getWeatherData(latitude, longitude);
    console.log(`✅ 天气数据:`, weatherData);
    return weatherData;
  },
});

// 3. 计算器工具
export const calculator = tool({
  description: '执行数学计算，支持加减乘除和基本函数。例如：10+20*3',
  parameters: z.object({
    expression: z.string().describe('数学表达式，如 2+3*4 或 10+20*3'),
  }),
  execute: async ({ expression }) => {
    try {
      const cleanedExpr = expression.replace(/\s+/g, '');
      const allowed = /^[0-9+\-*/().]+$/;
      if (!allowed.test(cleanedExpr)) {
        throw new Error('包含非法字符。只允许数字、运算符 +-*/() 和小数点');
      }
      const result = Function(`"use strict"; return (${cleanedExpr})`)();
      return { result, expression: cleanedExpr };
    } catch (error) {
      throw new Error(`计算错误：${error}`);
    }
  },
});

// 4. 时间工具 - 使用空对象作为参数
export const getTime = tool({
  description: '获取当前时间',
  parameters: z.object({}),
  execute: async () => {
    const now = new Date();
    return { time: now.toLocaleString('zh-CN'), timestamp: now.getTime() };
  },
});

// 导出工具名称列表，用于判断是否需要 Agent
export const AGENT_TOOL_NAMES = ['getGeocode', 'getCurrentWeather', 'calculator', 'getTime'];

// 导出工具描述，用于 LLM 判断
export const AGENT_TOOLS_DESCRIPTION = `
可用工具列表：
1. getGeocode - 通过城市名称查询经纬度
2. getCurrentWeather - 获取指定经纬度的当前天气
3. calculator - 执行数学计算
4. getTime - 获取当前时间
`;
